package DigitalNetwork;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * Oszcilloszkop, mely rogziti a halozat kimenetet.
 * <p>
 * Kijelzo, mely a szimulacio egy bizonyos intervallumanak eredmenyet juttatja
 * el a felhasznalohoz.
 * </p>
 *
 * @author Ableda Peter
 * @author Andrasi Istvan
 * @author Kamaras Karoly
 * @author Pora Szilard
 *
 * @version 1.0 Build 2011.04.16.
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public class Oscilloscope extends Display {

	/** A tarolt jelfolyam. */
	private boolean[] signal;

	/** [Konstruktor]
     * letrehozza az inputs listat.
     *
     * @param ID_
     * @param x Az elem poziciojanak vizszintes komponense.
     * @param y Az elem poziciojanak fuggoleges komponense.
     */
	//==========================================================================
	public Oscilloscope(String ID_, int x, int y) {
        super(x,y);
		/**ID beallitasa*/
		this.ID = ID_;
		/**Input letrehozasa*/
		this.inputs = new ArrayList<PortIn>();
		inputs.add(new PortIn(this.ID + "_i1", this));
        Main.printMessage("#" + this.getID()
                + " Oszcilloszkop kimenet letrehozva");

		// Letrehozunk egy 0 hosszu jeltarolot.
		this.signal = new boolean[0];
	}
	//==========================================================================

	/**
     * Vissza adja az oszcilloszkop aktualis allapotat.
	 *
	 * @return Az aktualis kimeneti ertek.
	 */
	@Override
	//==========================================================================
	public boolean getState() {
		// Iteracio vegen hivodik, ekkor el is kell tarolni az uj erteket.
		boolean high = this.inputs.get(0).getState();

		// Eggyel nagyobb tombot foglalunk.
		boolean[] temp = new boolean[this.signal.length + 1];
		// A regi ertekeket atmasoljuk.
		System.arraycopy(this.signal, 0, temp, 0, this.signal.length);
		// BEtesszuk az uj elemet.
		temp[this.signal.length] = high;
		this.signal = temp;

		// Az aktualis erteket visszaadjuk.
		return high;
	}
	//==========================================================================

    /**
     * Vissza adja az oszcilloszkopban tarolt jelsorozatot.
	 *
	 * @return Az aktualis kimeneti ertek.
	 */
	//==========================================================================
	public boolean[] getSignal() {
        return this.signal;
	}
	//==========================================================================


	/**
     * Vissza adja az elem ID-jet es a belso allapotat.
     * 
     * @return String
     */
    @Override
	//==========================================================================
	public String print() {
		int[] output = new int[this.signal.length];
		for (int i = 0; i < this.signal.length; i++) {
			output[i] = (this.signal[i]) ? 1 : 0;
		}
		return "#" + this.ID + " Oszcilloszkop - " + Arrays.toString(output);
	}
	//==========================================================================


    /**
     * Vissza adja az adott elem tipusat.
	 *
	 * @return String Az elem tipusa.
	 */
	@Override
	//==========================================================================
	public String getType() {
		return "Oscilloscope";
	}
	//==========================================================================
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

